package kov.core
{
	import flash.display.Bitmap;
	import flash.display.DisplayObjectContainer;
	import flash.geom.Vector3D;
	import flash.utils.Dictionary;
	
	import kov.core.global.Global;
	import kov.geom.Cube;
	
	/**
	 * 世界。
	 * @author Y.Boy
	 */	
	public class World
	{
		private static var _wuid:uint;
		/**
		 * 用于自增的 world unique id 。
		 */		
		public static function get wuid():uint
		{
			return _wuid++;
		}
		
		/**
		 * 世界里的 NPC 。
		 */		
		protected var npcHash:Dictionary;
		
		/**
		 * 用于渲染的容器。
		 */		
		protected var renderer:WorldRenderer;
		
		/**
		 * 地图数据。
		 */		
		protected var _mapData:MapData;
		
		public function get mapData():MapData
		{
			return _mapData;
		}
		
		public function set mapData(value:MapData):void
		{
			_mapData = value;
			
			this.renderer.addMap(value.getBackground()); // 地图
			
			// 前景
			var fg:Vector.<Bitmap> = value.getFrontground();
			for each (var bmp:Bitmap in fg)
			{
				this.renderer.addStatic(bmp);
			}
			
			// Body 层的物品
			var bg:Vector.<IBody> = value.getBodyground();
			for each (var body:IBody in bg)
			{
				this.renderer.addBody(body.renderer);
			}
		}
		
		/**
		 * 世界里的 player 。
		 */		
		public var player:IBody;
		
		/**
		 * 构造函数。
		 * @params main 容纳世界的容器。
		 */		
		public function World(main:DisplayObjectContainer)
		{
			this.npcHash = new Dictionary();
			this.renderer = new WorldRenderer(this);
			main.addChild(this.renderer);
		}
		
		/**
		 * 获取跟参数 cube 有相交的 NPC 。
		 * @param cube 一个三维空间。
		 * @return 存放 NPC 的 Vector 对象。
		 */		
		public function getNPCIntersects(cube:Cube):Vector.<IBody>
		{
			var result:Vector.<IBody> = new Vector.<IBody>();
			for each (var body:IBody in this.npcHash)
			{
				if ( cube.intersectsCube(body.visibleCube) )
				{
					result.push(body);
				}
			}
			result.fixed = true;
			return result;
		}
		
		/**
		 * 添加一个 NPC 。
		 * @param npc 要添加到世界的 NPC 。
		 */		
		public function addNPC(npc:IBody):void
		{
			npc.wuid = World.wuid;
			this.npcHash[npc.wuid] = npc;
			this.renderer.addBody(npc.renderer);
		}
		
		/**
		 * 添加一个 player 。
		 * @param player 要添加到世界的 player 。
		 */		
		public function addPlayer(player:IBody):void
		{
			player.wuid = World.wuid;
			this.player = player;
			this.renderer.addBody(player.renderer);
			this.renderer.doLocateAtPlayer();
		}
		
		/**
		 * 移除一个 NPC 。
		 * @param npc 要移除的 NPC 。
		 */		
		public function removeNPC(npc:IBody):void
		{
			this.npcHash[npc.wuid] = null;
			delete this.npcHash[npc.wuid];
			this.renderer.removeChild(npc.renderer);
		}
		
		/**
		 * 移除 player 。
		 */		
		public function removePlayer():void
		{
			this.renderer.removeChild(this.player.renderer);
			this.player = null;
		}
		
	}
}